5.02. Управляющие конструкции
Управляющие конструкции
Управляющие конструкции в языке программирования Python представляют собой средства управления последовательностью выполнения инструкций в программе. Они позволяют изменять линейный поток исполнения кода в зависимости от условий, повторять блоки инструкций или управлять переходами между участками программы. Эти конструкции составляют основу структурного программирования и обеспечивают гибкость при реализации алгоритмов любой сложности.
Условные операторы
Условные операторы предназначены для ветвления выполнения программы на основе логических выражений. В Python используется ключевое слово if для начала проверки условия, elif (сокращение от else if) — для дополнительных условий, и else — для блока, выполняемого в случае, если ни одно из предыдущих условий не было истинным.
Синтаксис условной конструкции:
if условие1:
# блок кода 1
elif условие2:
# блок кода 2
else:
# блок кода 3
Каждый блок кода должен быть выделен отступом (PEP 8 рекомендует использовать 4 пробела). Интерпретатор оценивает условия по порядку; выполнение передаётся первому блоку, чьё условие вернуло True. Остальные ветви игнорируются.
Пример:
x = 10
if x > 15:
print("x больше 15")
elif x > 5:
print("x больше 5, но не больше 15")
else:
print("x меньше или равно 5")
Важно отметить, что ветви elif и else являются опциональными. Конструкция может состоять только из одного if.
Логические операторы
Логические операторы используются для комбинирования или инвертирования булевых выражений. В Python они представлены словами and, or, not, в отличие от многих других языков программирования, где применяются символьные аналоги (&&, ||, !). Это делает код более читаемым, но требует внимания при сравнении с другими C-подобными языками.
and— возвращает True, если оба операнда истинны.or— возвращает True, если хотя бы один операнд истинен.not— возвращает логическое отрицание операнда.
Операторы работают по принципу короткого замыкания (short-circuit evaluation):
xandy: если x ложно, y не вычисляется.xory: если x истинно, y не вычисляется. Пример:
a = True
b = False
print(a and b) # False
print(a or b) # True
print(not a) # False
Такой подход позволяет эффективно управлять порядком вычислений и избегать ошибок, например:
if obj is not None and obj.has_method():
obj.method()
Здесь has_method() не будет вызван, если obj — None, поскольку первая часть условия ложна, и вторая не вычисляется.
Циклы
Циклы предназначены для многократного выполнения блока кода. В Python реализованы два типа циклов: for и while, каждый из которых решает разные задачи.
Цикл for в Python является итерационным, а не счётным, как в некоторых других языках. Он предназначен для обхода элементов итерируемого объекта — коллекций, строк, диапазонов и других объектов, поддерживающих протокол итерации.
Синтаксис:
for переменная in итерируемый_объект:
# тело цикла
Часто в качестве итерируемого объекта используется функция range(), которая генерирует арифметическую последовательность чисел.
Функция range(stop) — создаёт объект диапазона, содержащий целые числа от 0 до stop - 1.
range(start, stop[, step]) позволяет задать начальное значение, конечное значение (не включая его) и шаг.
Примеры:
# Вывод значений от 0 до 9
for i in range(10):
print(i, end=" ")
print()
# От 0 до 45 с шагом 5
for i in range(0, 50, 5):
print(i, end=" ")
print()
# Обратный порядок: от 10 до 1
for i in range(10, 0, -1):
print(i, end=" ")
print()
# Итерация по строке
for letter in 'word':
print(letter)
Обратите внимание: range() возвращает объект типа range, который является ленивым (lazy) — числа генерируются по мере необходимости, что экономит память.
Цикл for можно использовать с любыми итерируемыми типами: списками, кортежами, множествами, словарями (ключи), генераторами и т.д.
Цикл while выполняет блок кода до тех пор, пока указанное условие остаётся истинным. Он используется, когда количество итераций заранее неизвестно.
Синтаксис:
while условие:
# тело цикла
Пример:
count = 0
while count < 5:
print(count)
count += 1
Важно обеспечить выход из цикла, иначе он станет бесконечным. Бесконечный цикл возникает, если условие никогда не становится ложным:
while True:
print("Это бесконечный цикл")
Такие конструкции допустимы, если внутри цикла предусмотрен механизм прерывания через break.
Для детального контроля над выполнением циклов и условных блоков в Python предусмотрены специальные управляющие инструкции.
break — немедленно прекращает выполнение текущего цикла и передаёт управление следующему за ним блоку кода. Часто используется при поиске элемента или обработке ошибок.
for i in range(10):
if i == 5:
break
print(i) # Вывод: 0, 1, 2, 3, 4
continue — прерывает текущую итерацию и переходит к следующей. Управление возвращается к началу цикла, где проверяется условие.
for i in range(5):
if i == 2:
continue
print(i) # Вывод: 0, 1, 3, 4
pass — пустая операция. Используется как заглушка, когда синтаксически требуется наличие инструкции, но логика ещё не реализована.
if condition:
pass # Заглушка для будущей реализации
else:
print("Условие ложно")
pass также применяется в определениях классов, функций и блоков, где отсутствие кода привело бы к синтаксической ошибке.
Операторы is и == выполняют разные типы сравнения, что важно понимать для корректной работы с объектами.
== — проверяет равенство значений двух объектов. Вызывает метод __eq__() соответствующего класса.
is — проверяет идентичность объектов, то есть указывают ли две переменные на один и тот же объект в памяти (сравнивает их идентификаторы через id()).
Пример:
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True — значения одинаковы
print(a is b) # False — это разные объекты в памяти
Однако:
c = a
print(a is c) # True — c ссылается на тот же объект, что и a
Исключение составляют малые целые числа и строки, которые интернируются (кэшируются) интерпретатором. Например:
x = 256
y = 256
print(x is y) # True (в большинстве реализаций)
x = 257
y = 257
print(x is y) # Может быть False — зависит от контекста выполнения
По этой причине не рекомендуется использовать is для сравнения значений, особенно числовых или строковых. Оператор is следует применять в основном для сравнения с None, True, False и другими синглтонами:
if obj is None:
print("Объект не определён")
Это считается лучшей практикой, поскольку None — уникальный объект.